package lei.b_java数据类型;

import com.sun.jdi.IntegerValue;

/**
 * @className: A基本数据类型
 * @author: xl
 * @date: 2025/2/28 20:34
 * @Version: 1.0
 * @description:
 */

public class A基本数据类型 {
    public static void main(String[] args) {

        /**
         * 为什么不是固定小数位？
         * 浮点数的精度随数值大小动态变化 例如：
         * double 能精确表示 9007199254740992 (16位整数)
         * 但无法精确表示 0.1 + 0.2 (简单小数)
         * 遵循 IEEE 754 标准，优先保证大范围数值而非绝对精度
         * 💡 关键结论：
         * 若需精确计算（如金融场景），必须使用 BigDecimal
         * 若仅需显示格式化，用 String.format() 或 DecimalFormat 控制小数位
         * 常规科学计算可接受误差时，优先用 double（性能远高于 BigDecimal）
         *
         *
         * 然而，0.1和0.2在二进制中是无限循环小数：
         * 0.1（十进制） = 0.0001100110011001100110011001100110011001100110011...（二进制）
         * 0.2（十进制） = 0.001100110011001100110011001100110011001100110011...（二进制）
         * 当计算机存储这些数时，只能存储有限的位数（对于double，尾数部分有52位存储空间，加上一个隐含的1，共53位精度），因此会进行舍入，从而产生微小的误差。
         * 因此，0.1和0.2在double中存储的是近似值，它们的和0.3也是一个近似值，实际计算中可能略有偏差。
         *
         * 类型       转换方法            设计目标                  输出出规则
         * float     Float.toString()   优化可读性，隐藏冗余精度   最多7位有效数字
         * double    ouble.toString()   保证可逆性，暴露完整精度   必要位数表示唯一值
         *
         * 所有浮点类型（float/double）都有精度限制
         * float 的误差被默认输出方式掩盖，并非不存在
         * 需要精确计算时，必须使用 BigDecimal
         */


        byte byteValue=100;

        short shortValue=byteValue;

        int intValue=shortValue;

        long longValue=intValue;

        float floatvalue=longValue;

        double doubleValue=floatvalue;

        char charValue='A';

        boolean booleanValue=true;


        // 定义一个 byte 类型的变量
        byte byteValue1 = 10;
        // 自动转换为 int 类型
        int intValue1 = byteValue1;
        System.out.println("intValue1: " + intValue1);

        // 定义一个 int 类型的变量
        int anotherIntValue1 = 20;
        // 自动转换为 double 类型
        double doubleValue1 = anotherIntValue1;
        System.out.println("doubleValue1: " + doubleValue1);


        //自动装箱
        int a=10;
        Integer integerValue =Integer.valueOf(10);

        //自动拆箱
        int intvalue=integerValue.intValue();


        //它指的是将基本数据类型自动转换为对应的包装类对象。
        String number="100";
        int intvalue2=Integer.parseInt(number);

        int number2=100;
        String stringValue=String.valueOf(number2);

        float a1=0.1f;
        float a2=0.2f;


        double a3=0.1;
        double a4=0.2;


        System.out.println(a2+a1);
        System.out.println(a4+a3);



    }
}

